デダクション・ガイド

可能であれば、concurrent_vector コンストラクターは、クラス・テンプレート引数を推測することができます (C++17 以降)。次のコンストラクターは、暗黙的に生成されたデダクション・ガイドを提供します。

  • 明示的な allocator_type 引数を持つコンストラクターを含む、コンストラクターのコピーと移動

  • コンストラクターは引数として std::initializer_list を受け入れます

さらに、次の明示的なデダクション・ガイドが提供されます。


template <typename InputIterator, 
          typename Allocator = tbb::cache_aligned_allocator<iterator_value_t<InputIterator>>> 
concurrent_vector( InputIterator, InputIterator, 
                     Allocator = Allocator() ) 
-> concurrent_vector<iterator_value_t<InputIterator>, 
                       Allocator>;

ここで、 タイプエイリアス iterator_value_t は次のように定義されます:


template <typename InputIterator> 
using iterator_value_t = typename std::iterator_traits<InputIterator>::value_type;

このデダクション・ガイドは、次の要件が満たされる場合にのみ、オーバーロードの解決に関係します。

  • InputIterator タイプは、[input.iterators] ISO C++ 標準の InputIterator の要件を満たしている必要があります。

  • Allocator タイプは、[allocator.requirements ISO C++ 標準の Allocator の要件を満たしている必要があります。


#include <oneapi/tbb/concurrent_vector.h>  
#include <array> 
#include <memory> 

int main() { 
    std::array<int, 100> arr; 

    // Deduces cv1 as oneapi::tbb::concurrent_vector<int> 
    oneapi::tbb::concurrent_vector cv1(arr.begin(), arr.end()); 

    std::allocator<int> alloc; 

    // Deduces cv2 as oneapi::tbb::concurrent_vector<int, std::allocator<int>> 
    oneapi::tbb::concurrent_vector cv2(arr.begin(), arr.end(), alloc); 
}